表---list

对电话簿的插入和删除有可能很频繁。这样,对于表示一个简单的电话簿而言,采用表就可能比采用向量更为合适。例如写:

    list<Entry> phone_book;

如果使用的是表,我们将倾向于不采用通过下标访问元素,像对向量的一般做法那样,而可能是检索这个表,去寻找具有某个给定值的元素。在这样做时,我们利用了这样的事实:表也是一个序列,如3.8节所述。

    void print_entry(const string& s)
    {
        typedef list<Entry>::const_iterator LI;
        for(LI i = phone_book.begin(); i != phone_book.end(); ++i)
        {
            const Entry& e = *i;    // 采用引用是为了方便
            if(s == e.name)
            {
                cout << e.name << ' ' << e.number << '\n';
                return;
            }
        }
    }

s 的检索从表的起始处开始,一直进行到 s 被找到,或是达到了表的结束位置。每个标准库容器都提供了函数 begin()end(),它们分别返回到容器中第一个元素和超过末尾一个元素的迭代器。对于一个给定的迭代器 i,相应地下一个元素是 ++i,它所引用的元素是 *i

用户不必知道标准容器的迭代器的确切类型。这种迭代器的类型是容器定义的一部分,可以通过名字引用。当我们不需要修改容器的元素时,const_iterator 就是我们所需要的类型。如果要修改元素,我们就应该用普通的 iterator 类型。

向一个list加入一个元素也很容易:

    void add_entry(Entry& e, list<Entry>::iterator i)
    {
        phone_book.push_front(e);    // 加在开头
        phone_book.push_back(e);     // 加在最后
        phone_book.insert(i, e);     // 加在'i'所引用的元素之前
    }

🔚